<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 正则表达式的相关属性:
    // source   返回正则表达式的 规则部分
    // flags    返回正则表达式的 修饰符部分

    // ignoreCase  是否忽略大小写
    // global      是否全局匹配

    // lastIndex   返回正则表达式检索字符串时的起始位置 (默认: 0)


    // var reg = /day/ig;
    // var reg = new RegExp("day", "ig");
    // console.log(reg, typeof reg);
    // console.dir(reg);


    // 正则表达式的相关方法:
    // test() 用正则表达式,检索字符串,判断字符串中是否存在符合规则的某个或某段字符串  存在=> true 不存在 => false
    // exec() 用正则表达式,检索字符串,判断字符串中是否存在符合规则的某个或某段字符串 => 将符合规则的某个或某段字符 提取出来放到数组中  =>   存在=> 数组 不存在 => null

    // 语法: 正则.方法();

    // var str = "good good study , day day up";
    // var reg = /day/; // "day"
    // console.log(reg.test(str));  //  true

    // var str = "good good study , Day dAy up";
    // var reg = /day/; // "day"
    // console.log(reg.test(str));  //  false

    // 添加修饰符i => 忽略大小写 匹配模式变得更多
    // var str = "good good study , Day dAy up";
    // var reg = /day/i; // D|d  A|a  Y|y  => 8中 => 只要包含匹配模式中的一种即可
    // console.log(reg.test(str));  //  true

    // 添加修饰符i => 忽略大小写 匹配模式变得更多
    // 添加修饰符g => 全局匹配  -> 可以记录检索的位置,下次继续向后检索


    // 如果不添加修饰符g,每次从字符串开头位置检索(lastIndex = 0)
    // 如果添加了修饰符g,第一次从字符串开头位置检索,如果存在符合规则的某个或某段字符,返回true,记录下次检索开始的位置(lastIndex),下次检索时继续向后检索;检索不到就返回false ,检索位置重置为0(lastIndex = 0), 以此类推 直到检索整个字符串

    // var str = "good good study , Day dAy up";
    // var reg = /day/ig; // D|d  A|a  Y|y  => 忽略大小写 全局匹配
    // console.log(reg.lastIndex, reg.test(str));  //0  true
    // console.log(reg.lastIndex, reg.test(str));  //21  true
    // console.log(reg.lastIndex, reg.test(str));  //25  false
    // console.log(reg.lastIndex); // 0

    // console.log(reg.lastIndex, reg.test(str));  //0  true
    // console.log(reg.lastIndex, reg.test(str));  //21  true
    // console.log(reg.lastIndex, reg.test(str));  //25  false
    // console.log(reg.lastIndex); // 0

    // console.log(reg.lastIndex, reg.test(str));  //0  true
    // console.log(reg.lastIndex, reg.test(str));  //21  true
    // console.log(reg.lastIndex, reg.test(str));  //25  false
    // console.log(reg.lastIndex); // 0


    // exec()

    // var str = "good good study , day day up";
    // var reg = /day/; // "day"
    // console.log(reg.exec(str));  //  ["day"]

    // var str = "good good study , Day dAy up";
    // var reg = /day/; // "day"
    // console.log(reg.exec(str));  //  null


    // 添加修饰符i => 忽略大小写 匹配模式变得更多
    // var str = "good good study , Day dAy up";
    // var reg = /day/i; // D|d  A|a  Y|y  => 8中 => 只要包含匹配模式中的一种即可
    // console.log(reg.exec(str));  //  ["Day"]

    // exec()
    // 如果不添加修饰符g,每次从字符串开头位置检索(lastIndex = 0)
    // 如果添加了修饰符g,第一次从字符串开头位置检索,如果存在符合规则的某个或某段字符,返回数组,记录下次检索开始的位置(lastIndex),下次检索时继续向后检索;检索不到就返回null ,检索位置重置为0(lastIndex = 0), 以此类推 直到检索整个字符串

    // var str = "good good study , Day dAy up";
    // var reg = /day/ig; // D|d  A|a  Y|y  => 忽略大小写 全局匹配
    // console.log(reg.lastIndex, reg.exec(str));  //0  ["Day"]
    // console.log(reg.lastIndex, reg.exec(str));  //21 ["dAy"]
    // console.log(reg.lastIndex, reg.exec(str));  //25  null
    // console.log(reg.lastIndex); // 0

    // console.log(reg.lastIndex, reg.exec(str));  //0  ["Day"]
    // console.log(reg.lastIndex, reg.exec(str));  //21 ["dAy"]
    // console.log(reg.lastIndex, reg.exec(str));  //25  null
    // console.log(reg.lastIndex); // 0



    // 为什么字符串的match可以检索两个?
    // var str = "good good study , Day dAy up";
    // var reg = /day/ig; // D|d  A|a  Y|y  => 忽略大小写 全局匹配

    // console.log(str.match("Day"));
    // console.log(str.match(reg));

    // 模拟封装字符串的match  match本质上通过exec二次封装得到的
    function myMatch(str, reg) {
        // 是否全局匹配
        if (reg.global) {  // 如果全局匹配 -> 检索整个字符串
            var arr = [];

            // 全局匹配 => 我也不知道检索多少次? 
            // 知道的: 检查成功 -> 返回数组   检索失败 -> null
            var res = null;
            while (res = reg.exec(str)) {  // 先检索一次 将检索的结果赋值给变量res -> 作为循环条件 
                arr.push(res[0]);
            }

            if (arr.length > 0) {
                return arr;
            } else {
                return null;
            }

        } else { // 没有全局匹配 -> 只检索依次
            return reg.exec(str);
        }
    }


    var str = "good good study , Day dAy up";
    var reg = /day/i; // D|d  A|a  Y|y  => 忽略大小写 全局匹配
    console.log(myMatch(str, reg));

    var str = "good good study , Day dAy up";
    var reg = /day/ig; // D|d  A|a  Y|y  => 忽略大小写 全局匹配
    console.log(myMatch(str, reg));












</script>

</html>